package com.easylinkin.linkappapi.lobar.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.easylinkin.linkappapi.lobar.dto.UserClockDTO;
import com.easylinkin.linkappapi.lobar.dto.UserProjectDTO;
import com.easylinkin.linkappapi.lobar.dto.screen.LobarScreenDTO;
import com.easylinkin.linkappapi.lobar.entity.Group;
import com.easylinkin.linkappapi.lobar.entity.UserClock;
import com.easylinkin.linkappapi.shigongyun.vo.TenantProjectCountVo;
import com.easylinkin.linkappapi.shigongyun.vo.UserClockGateVo;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户考勤表 Mapper 接口
 * </p>
 *
 * @author kanyuanfeng
 * @since 2022-04-13
 */
public interface UserClockMapper extends BaseMapper<UserClock> {

    IPage<UserClockDTO> queryListByPage(Page page, @Param("userClockDTO") UserClockDTO userClockDTO);

    IPage<UserClockDTO> queryRecordByPage(Page page, @Param("userClockDTO") UserClockDTO clockDTO);

    IPage<UserClockDTO> queryList(Page page, @Param("userClockDTO") UserClockDTO clockDTO);

    /**
     * 查询班组某个时间点打卡人数
     *
     * @return
     */
    List<UserClock> findOnUser(@Param("group") Group group, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 根据条件，分页(不分页)查询月视图
     *
     * @param page
     * @param clockDTO
     * @return
     */
    IPage<UserClockDTO> queryMonth(Page page, @Param("userClockDTO") UserClockDTO clockDTO);

    //查询该月的所有考勤
    List<UserClock> findAllMonth(@Param("userClockDTO") UserClockDTO clockDTO);

    //查询该月的所有考勤导出月视图用
    List<UserClock> findAllMonthForExport(@Param("userClockDTO") UserClockDTO clockDTO);

    List<LobarScreenDTO> userByTime(@Param("userClockDTO") UserClockDTO userClockDTO);

    List<UserClock> findUserByTime(@Param("userClockDTO") UserClockDTO userClockDTO);

    /**
     * 最近几次考勤
     */
    List<UserClockDTO> findLast(@Param("tenantId") String tenantId, @Param("size") int size);

    /**
     * 根据条件统计进出数量
     *
     * @param userClockGateVo 疫情条件vo
     * @return 统计数量 list
     */
    List<Map<String, Object>> countNumGroupByInOut(UserClockGateVo userClockGateVo);

    /**
     * 统计面板机打卡数量根据用户、进出方向分组
     *
     * @param tenantProjectCountVo 租户项目条件vo
     * @return 根据用户、进出方向分组的打卡数量list
     */
    List<Map<String, Object>> countNumGroupByUserAndDire(TenantProjectCountVo tenantProjectCountVo);

    List<UserClockDTO> getTenClock(@Param("tenantId") String tenantId, @Param("num") int num);

    List<UserClockDTO> getByToday(String tenantId);

    List<UserProjectDTO> findNewAttention(@Param("tenantId")String tenantId, @Param("size") int i);

    /**
     * 估计条件查询最后打卡时间
     *
     * @param clockDto 打卡入参dto
     * @return 打卡记录
     */
    List<UserClockDTO> queryLastUserClockList(UserClockDTO clockDto);

    /**
     * 获取人员出场告警对应的进场记录
     *
     * @param id 人员出场预警id
     * @return 人员出场告警对应的进场记录
     */
    UserClock getOutinWarnClockIn(String id);

    //最近10次打卡
    List<UserClockDTO> getByDeviceCode(@Param("deviceCode") String deviceCode,@Param("tenantId") String tenantId, @Param("size") int size);

    //项目id获取考勤记录
    List<UserClock> dockGetListByTenantId(@Param("tenantId") String tenantId);

    /**
     * 通过userId查询对应人员最近考勤时间
     * @param clockDTO
     * @return
     */
    String queryClockTime(@Param("clockDto") UserClockDTO clockDTO);
}
